home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Carnage_Contest / scripts / CC Original / weapons / Poison Grenade.lua < prev    next >
Text File  |  2010-08-31  |  7KB  |  187 lines

  1. --------------------------------------------------------------------------------
  2. -- Weapon Poison Grenade + Projectile Poison Grenade
  3. -- Original Carnage Contest Weapon
  4. -- Script by DC, September 2009, www.UnrealSoftware.de
  5. --------------------------------------------------------------------------------
  6.  
  7. -- Setup Tables
  8. if cc==nil then cc={} end
  9. cc.poisongrenade={}
  10. cc.poisongrenade.poisongrenade={}
  11.  
  12. -- Load & Prepare Ressources
  13. cc.poisongrenade.gfx_wpn=loadgfx("weapons/poisongrenade.bmp")                    -- Weapon Image
  14. setmidhandle(cc.poisongrenade.gfx_wpn)
  15. cc.poisongrenade.sfx_attack=loadsfx("throw.ogg")                                -- Attack Sound
  16. cc.poisongrenade.sfx_bounce=loadsfx("bounce.wav")                                -- Bounce Sound
  17. cc.poisongrenade.sfx_poison=loadsfx("steamslow.ogg")                            -- Steam
  18.  
  19. --------------------------------------------------------------------------------
  20. -- Weapon: Poison Grenade
  21. --------------------------------------------------------------------------------
  22.  
  23. cc.poisongrenade.id=addweapon("cc.poisongrenade","Poison Grenade",cc.poisongrenade.gfx_wpn,0,2)    -- Add Weapon (0 uses, first in round 2)
  24.  
  25. function cc.poisongrenade.draw()                                            -- Draw
  26.     if weapon_shots<=0 then
  27.         setblend(blend_alpha)
  28.         setalpha(1)
  29.         setcolor(255,255,255)
  30.         drawinhand(cc.poisongrenade.gfx_wpn,6,0)
  31.     end
  32.     -- HUD chargebar
  33.     if weapon_charge>0 and weapon_shots==0 then
  34.         hudchargebar(weapon_charge,100)
  35.     end
  36.     -- HUD Crosshair / HUD Timer
  37.     if weapon_shots==0 then
  38.         hudcrosshair(4,3)
  39.         hudtimer(3,1,10)
  40.     end
  41. end
  42.  
  43. function cc.poisongrenade.attack(attack)                                    -- Attack
  44.     if (weapon_shots<=0) then
  45.         -- Charge
  46.         if (attack==1) then
  47.             weapon_charge=weapon_charge+1                                    -- Increase charge
  48.         end
  49.         -- Fire a projectile (on release/full charge)
  50.         if (attack==0 and weapon_charge>0) or (weapon_charge>=100) then
  51.             -- No more weapon switching!
  52.             useweapon(0)
  53.             playsound(cc.poisongrenade.sfx_attack)
  54.             weapon_shots=weapon_shots+1
  55.             id=createprojectile(cc.poisongrenade.poisongrenade.id)
  56.             projectiles[id]={}
  57.             -- Ignore collision with current player at beginning
  58.             projectiles[id].ignore=playercurrent()
  59.             -- Set initial position of projectile
  60.             projectiles[id].x=getplayerx(0)+(4*getplayerdirection(0))
  61.             projectiles[id].y=getplayery(0)+3
  62.             -- Initial collision check (avoid throwing into other objects)
  63.             for i=0,10,1 do
  64.                 if collision(col5x5,projectiles[id].x+math.sin(math.rad(getplayerrotation(0)))*i,projectiles[id].y-math.cos(math.rad(getplayerrotation(0)))*i)==1 then
  65.                     if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  66.                         if (i==0) then
  67.                             projectiles[id].x=getplayerx(0)
  68.                             projectiles[id].y=getplayery(0)+3
  69.                             break
  70.                         else
  71.                             projectiles[id].x=getplayerx(0)+(4*getplayerdirection(0))+math.sin(math.rad(getplayerrotation(0)))*(i-1)
  72.                             projectiles[id].y=getplayery(0)+3-math.cos(math.rad(getplayerrotation(0)))*(i-1)
  73.                             break
  74.                         end
  75.                     end
  76.                 end
  77.             end
  78.             -- Set speed of projectile
  79.             projectiles[id].sx=math.sin(math.rad(getplayerrotation(0)))*(weapon_charge/100.0)*10.0
  80.             projectiles[id].sy=-math.cos(math.rad(getplayerrotation(0)))*(weapon_charge/100.0)*10.0
  81.             -- Set timer
  82.             projectiles[id].timer=weapon_timer*50
  83.             -- Effects
  84.             recoil(2)
  85.             -- End Turn
  86.             endturn()
  87.         end
  88.     end
  89. end
  90.  
  91. --------------------------------------------------------------------------------
  92. -- Projectile: Poison Grenade
  93. --------------------------------------------------------------------------------
  94.  
  95. cc.poisongrenade.poisongrenade.id=addprojectile("cc.poisongrenade.poisongrenade")    -- Add Projectile
  96.  
  97. function cc.poisongrenade.poisongrenade.draw(id)                                    -- Draw
  98.     -- Setup draw mode
  99.     setblend(blend_alpha)
  100.     setalpha(1)
  101.     setcolor(255,255,255)
  102.     setscale(1,1)
  103.     -- Calculate projectile rotation
  104.     setrotation(math.deg(math.atan2(projectiles[id].sx,-projectiles[id].sy)))
  105.     -- Draw projectile
  106.     drawimage(cc.poisongrenade.gfx_wpn,projectiles[id].x,projectiles[id].y)
  107.     -- Draw Arrow if out of Screen
  108.     outofscreenarrow(projectiles[id].x,projectiles[id].y)
  109. end
  110.  
  111. function cc.poisongrenade.poisongrenade.update(id)                                    -- Update
  112.     -- Gravity influence on speed
  113.     projectiles[id].sy=projectiles[id].sy+getgravity()
  114.     -- Move (in substep loop for optimal collision precision)
  115.     msubt=math.ceil(math.max(math.abs(projectiles[id].sx),math.abs(projectiles[id].sy))/3)
  116.     msubx=projectiles[id].sx/msubt
  117.     msuby=projectiles[id].sy/msubt
  118.     for i=1,msubt,1 do
  119.         -- Move X
  120.         projectiles[id].x=projectiles[id].x+msubx
  121.         if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  122.             if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  123.                 if (math.abs(projectiles[id].sx)>0.5) then playsound(cc.poisongrenade.sfx_bounce) end
  124.                 projectiles[id].x=projectiles[id].x-msubx
  125.                 projectiles[id].sx=-projectiles[id].sx*0.3
  126.                 msubx=-msubx*0.3
  127.             end
  128.         else
  129.             projectiles[id].ignore=0
  130.         end
  131.         -- Move Y
  132.         projectiles[id].y=projectiles[id].y+msuby
  133.         if collision(col5x5,projectiles[id].x,projectiles[id].y)==1 then
  134.             if terraincollision()==1 or objectcollision()>0 or playercollision()~=projectiles[id].ignore then
  135.                 if (math.abs(projectiles[id].sy)>0.5) then playsound(cc.poisongrenade.sfx_bounce) end
  136.                 projectiles[id].y=projectiles[id].y-msuby
  137.                 projectiles[id].sy=-projectiles[id].sy*0.3
  138.                 msuby=-msuby*0.3
  139.                 projectiles[id].sx=projectiles[id].sx*0.9
  140.                 msubx=msubx*0.9
  141.             end
  142.         else
  143.             projectiles[id].ignore=0
  144.         end        
  145.         -- Water
  146.         if (projectiles[id].y)>getwatery()+5 then
  147.             -- Effects
  148.             particle(p_waterhit,projectiles[id].x,projectiles[id].y)
  149.             playsound(sfx_hitwater1)
  150.             -- Free projectile
  151.             freeprojectile(id)
  152.             break
  153.         end
  154.     end
  155.     -- Timer -> Explode
  156.     projectiles[id].timer=projectiles[id].timer-1
  157.     if projectiles[id].timer<=0 then
  158.         -- Poison
  159.         playsound(cc.poisongrenade.sfx_poison)
  160.         particle(p_smoke,projectiles[id].x,projectiles[id].y)
  161.         particlealpha(0.5)
  162.         particlecolor(0,255,0)
  163.         particlesize(30,30)
  164.         particlefadealpha(0.005)
  165.         for angle=0,340,20 do
  166.             particle(p_smoke,projectiles[id].x,projectiles[id].y)
  167.             particlespeed(math.sin(math.rad(angle))*0.5,-math.cos(math.rad(angle))*0.5)
  168.             particlealpha(1.0)
  169.             particlecolor(0,255,0)
  170.             particlesize(20,20)
  171.             particlefadealpha(0.009)
  172.         end
  173.         -- Poison Players
  174.         players=playertable()
  175.         for i=1,#players,1 do
  176.             if getplayerhealth(players[i])>0 then
  177.                 if math.sqrt((getplayerx(players[i])-projectiles[id].x)^2+(getplayery(players[i])-projectiles[id].y)^2)<=70 then
  178.                     playerstate(players[i],state_poisoned,1)
  179.                 end
  180.             end
  181.         end
  182.         -- Free projectile
  183.         freeprojectile(id)
  184.     end
  185.     -- Scroll to projectile
  186.     scroll(projectiles[id].x,projectiles[id].y)
  187. end